/******************************************************************************* * Copyright (c) 2004, 2015 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.ui.internal; import java.util.ArrayList; import java.util.Iterator; import java.util.List; /** * Represents an object with state that will notifies a set of listeners * whenever its state changes */ public class Model { /** * Current state of the model */ private Object state; /** * Set of objects that will be notified about state changes */ private List views = new ArrayList(1); /** * Creates a new model with the given initial state. * * @param initialState */ public Model(Object initialState) { state = initialState; } /** * Returns the current state of the model. * * @return the current model state */ public Object getState() { return state; } /** * Sets the current state of the model. * * @param newState the new state of the model * @param toOmit change listener that should be omitted from change notifications (or null if all * listeners should be notified). */ public void setState(Object newState, IChangeListener toOmit) { if (areEqual(newState, state)) { return; } state = newState; Iterator iter = views.iterator(); while (iter.hasNext()) { IChangeListener next = (IChangeListener) iter.next(); if (next != toOmit) { next.update(true); } } } private boolean areEqual(Object o1, Object o2) { if (o1 == null) { return o2 == null; } if (o2 == null) { return false; } return o1.equals(o2); } /** * Adds the given listener to the set of listeners that will be * notified when the state changes. * * @param toAdd */ public void addChangeListener(IChangeListener changeListener) { changeListener.update(false); views.add(changeListener); } /** * Stops this model from sending change events from the given listener. * * @param toRemove */ public void removeChangeListener(IChangeListener changeListener) { views.remove(changeListener); } }